package csp;

import java.io.*;
import java.util.*;



public class Knoten {

	public enum Werte {
		ROT, GELB, GRUEN, BLAU, NULL
	};
	
	// Attribute
	String name;
	List<Knoten> nachbarn = new ArrayList<Knoten>();
	List<String> nachbarList = new ArrayList<String>();	// nur als zwischenspeicher
	Werte wert = Werte.NULL;
	List<Werte> wertebereich = new ArrayList<Werte>();

	// Konstruktor (lese erste Zeile in Datei)
	public Knoten() throws IOException {

		// erstelle Dateizugriff
		FileReader fr;
		fr = new FileReader("staatenEuropas.txt");
		BufferedReader br = new BufferedReader(fr);

		String zeile = br.readLine();

		// Schließe Reader
		br.close();
		fr.close();

		// Teile String
		String trennzeichen = ":";
		String temp[];
		temp = zeile.split(trennzeichen);
		name = temp[0]; // Name zuweisen
		temp = temp[1].trim().split(", ");
		for (int i = 0; i < temp.length; i++) {
			// nachbarn.add(temp[i]); //Nachbarn zuweisen
		}
	}

	// Konstruktor (lese erste Zeile in Datei)
	public Knoten(int zeilennummer) throws IOException {

		// Wertebereich init
		wertebereich.add(Werte.BLAU);
		wertebereich.add(Werte.GELB);
		wertebereich.add(Werte.GRUEN);
		wertebereich.add(Werte.ROT);
		//Name aus txt-Datei zuweisen
		// erstelle Dateizugriff
		FileReader fr;
		fr = new FileReader("staatenEuropas.txt");
		BufferedReader br = new BufferedReader(fr);
		String zeile = new String();
		
		for (int i = 0; i < zeilennummer; i++) {
			zeile = br.readLine();
		}

		// Schließe Reader
		br.close();
		fr.close();

		// Teile String
		String trennzeichen = ":";
		String temp[];
		temp = zeile.split(trennzeichen);
		name = temp[0]; // Name zuweisen

		
		if (temp.length > 1) {
			temp = temp[1].trim().split(", ");
		for (int i = 0; i < temp.length; i++) {
			nachbarList.add(temp[i]);
		}
		}
		
	}

	public String getName(){
		return name;
	}
	
	public Werte getWert(){
		return wert;
	}
	
	public boolean setWert(Werte neu){
		wert = neu;
		return true;
	}
	
	public List<Knoten> getNachbarn(){
		return nachbarn;
	}
	
	public List<Werte> getWertebereich(){
		return wertebereich;
	}
	
	/*
	 * Konsistenz prüfen
	 * 
	 * es wird uberprueft ob die Belegung eines Knoten x mit dem Wert a
	 * und die Belegung eines Knoten y mit dem Wert b konsistent ist.
	 */
	public static boolean checkKonsistenz(Knoten a, Werte x, Knoten b, Werte y){
		
		boolean konsistent = true;
		
		// Knoten muessen in einer Beziehung stehen (d.h. benachbart sein),
		// damit eine Inkonsistenz herrschen kann.
		if( a.getNachbarn().contains(b) )
		{
			if(x==y)
				konsistent = false;
		}
		
		return konsistent;
	}
	
	/*
	 * Prüfe ob der Wert des eigenen Knoten gleich dem der Nachbarknoten ist
	 * 
	 * Rückgabe: Knoten, die einen Konflikt verursachen
	 */
	public List<Knoten> getKonflikte(){
	// Integer-Variante
	//public int getKonflikte(){
		
		List<Knoten> konflikte = new ArrayList<Knoten>();;
		
		for ( int i = 0; i < nachbarn.size(); i++){
			if ( wert == nachbarn.get(i).wert){
				konflikte.add(nachbarn.get(i));
			}
		}
		return konflikte;
		// Falls es jemand als Integer will
		//return konflikte.size();
		
	}
	
	public void printNachbarn() {
		System.out.println("\n-------------------------");
		System.out.println("Der Knoten " + name + " hat folgende Nachbarn: ");
		for (int i = 0; i < nachbarn.size(); i++) {
			if( i > 0)
				System.out.print(", ");
			System.out.print(nachbarn.get(i).name);
		}
		System.out.print("\n\n");
	}
	
	public void printWert() {
		System.out.println("Der Knoten " + name + " hat den Wert: " + wert);
		System.out.println("-------------------------");
	}
}
